package chenji.gunapi.gun;

import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import chenji.gunapi.GunAPI;
import chenji.gunapi.bullet.accuracy.BulletAccuracy;

public interface Gun {
	/**
	 * 获取枪械的一般伤害
	 * 
	 * @return 伤害
	 */
	public int getDamage();

	/**
	 * 获取射速，单位tick（1/20秒）
	 * 
	 * @return 射速
	 */
	public int getShootSpeed();

	/**
	 * 获取识别名。
	 * 
	 * @return 识别名
	 */
	public String getName();

	/**
	 * 获取枪械物品
	 * 
	 * @return 物品
	 */
	public ItemStack getItemStack();

	/**
	 * 获取弹夹容量
	 * 
	 * @return 容量
	 */
	public int getFullBulletAmount();

	/**
	 * 换弹
	 */
	public void reload();

	/**
	 * 获取子弹击中实体时，是否按照箭的效果向后击退。
	 */
	public boolean isKnockBack();

	/**
	 * 对子弹的属性进行一些发射前的准备
	 * 
	 * @param bullet
	 * @return -
	 */
	public Arrow makeBullet(Arrow bullet);

	/**
	 * 获取精度管理器
	 * 
	 * @return -
	 */
	public BulletAccuracy getAccuracy();

	/**
	 * 对子弹的属性进行一些发射前的准备
	 * 
	 * @param bullet
	 * @return -
	 */
	public Arrow setAccuracy(Arrow bullet, int amount, boolean ismoving);
	/**
	 * 是否支持自动连发
	 * @return
	 */
	public boolean autoShoot();
	/**
	 * 是否支持打开狙击镜
	 * @return
	 */
	public boolean canSights();
	/**
	 * 获取狙击镜。
	 * @return
	 */
	public Sight getSights();
	/**
	 * 获取重载处理程序
	 * @return
	 */
	public ReloadHandler getReloadHandler();
	/**
	 * 获取已经打出的子弹数的。
	 * @param time
	 * @return
	 */
	public int getAlreadShootAmount(long time);
	/**
	 * 发射子弹
	 * @param p
	 * @param alreadShoot
	 */
	public default void shoot(Player p, int alreadShoot) {
		GunAPI.getGunAPI().getBulletMnagaer().shoot(this, p, alreadShoot);
	}
	/**
	 * 获取声音处理者
	 * @return
	 */
	public SoundHandler getSoundHandler();


}
